package com.Date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;

class Date{
    private int year, month, day;

    Date(){}

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }
}

public class work_Calendar {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
//        Calendar cld;
        Date dt = new Date();
        int y, m, d;
        String date_S;
        System.out.println("输入年月日（格式为：2022 3 13）");

        y = in.nextInt();
        m = in.nextInt();
        d = in.nextInt();
        date_S = (y + "-" + m + "-" + d);
//        cld = Calendar.getInstance();
        set_Date(y, m, d, dt); //set年月日
//        System.out.println(is_Rig(dt));
        System.out.println(y + "年" + m + "月" + d + "日是今年第" + get_Days(dt) + "天");
        try {
            // 日期格式化类
            DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd");
            // 把字符串类型的日期转换为date类型的
            java.util.Date parse = dFormat.parse(date_S);
            // 创建一个公历类的实例
            Calendar calendar = new GregorianCalendar();
            // 把格式化好的日期对象放进Calendar
            calendar.setTime(parse);
            // 获取今天是几号
            int day = calendar.get(Calendar.DATE);
            // DATE设置成这个月的一号
            calendar.set(Calendar.DATE, 1);
            // 获取这个月的第一天是周几
            int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
            // 获取每个月最大的天数
            int maxDay = calendar.getActualMaximum(Calendar.DATE);

            System.out.println("日\t一\t二\t三\t四\t五\t六");

            // 循环打印 空格
            for (int i = 1; i < weekDay; i++) {
                System.out.print("\t");
            }
            // 循环打印天数
            for (int i = 1; i <= maxDay; i++) {
                // 判断如果i 等于 今天 前面打印一个❀做记号
                if (i == day) {
                    System.out.print("*");
                }
                // 打印 天数
                System.out.print(i + "\t");
                // 获取今天是周几
                int w = calendar.get(Calendar.DAY_OF_WEEK);
                // 如果今天是周六就让其换行
                if (w == Calendar.SATURDAY) {
                    System.out.println();
                }
                // 天数自增
                calendar.add(Calendar.DATE, 1);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }

    public static void set_Date(int y, int m, int d, Date dt) {
        dt.setDay(d);
        dt.setMonth(m);
        dt.setYear(y);
    }

    public static boolean is_Rig(Date dt) {
        int t = dt.getYear();

        return ((t % 4 == 0 && t % 100 != 0) || t % 400 == 0);
    }

    public static int get_Days(Date dt) {
        int m = dt.getMonth(), d = dt.getDay();
        int res = 0, tmp = 1;
        while (tmp <= m) {
            if (tmp == 1 || tmp == 3 || tmp == 5 || tmp == 7 || tmp == 8 || tmp == 10 || tmp == 12) {
                if(tmp == m){
                    res += d;
                    break;
                }
                res += 31;
                tmp ++ ;
            } else if (tmp == 2) {
                if(tmp == m){
                    res += d;
                    break;
                }
                if(is_Rig(dt)){
                    res += 29;
                    tmp ++ ;
                }
                else{
                    res += 28;
                    tmp ++ ;
                }
            } else {
                if(tmp == m){
                    res += d;
                    break;
                }
                res += 30;
                tmp ++ ;
            }

        }
        return res;
    }
}
